function W=bspline_coefficients(u,v,w)
switch(nargin)
    case 1
        W = bspline_coefficients_1d(u);
    case 2
        W = bspline_coefficients_2d(u,v);
    case 3
        W = bspline_coefficients_3d(u,v,w);
end
       
function W=bspline_coefficients_1d(u)
W(:,1) = (1-u).^3/6;
W(:,2) = ( 3*u.^3 - 6*u.^2+ 4)/6;
W(:,3) = (-3*u.^3 + 3*u.^2 + 3*u + 1)/6;
W(:,4) = u.^3/6;

function W = bspline_coefficients_2d(u,v)
Bu=bspline_coefficients_1d(u);
Bv=bspline_coefficients_1d(v);

% Calculate influences of all neighborh b-spline knots
W = [Bu(:,1).*Bv(:,1),Bu(:,2).*Bv(:,1),Bu(:,3).*Bv(:,1),Bu(:,4).*Bv(:,1), ...
     Bu(:,1).*Bv(:,2),Bu(:,2).*Bv(:,2),Bu(:,3).*Bv(:,2),Bu(:,4).*Bv(:,2), ...
     Bu(:,1).*Bv(:,3),Bu(:,2).*Bv(:,3),Bu(:,3).*Bv(:,3),Bu(:,4).*Bv(:,3), ...
     Bu(:,1).*Bv(:,4),Bu(:,2).*Bv(:,4),Bu(:,3).*Bv(:,4),Bu(:,4).*Bv(:,4)];


function W = bspline_coefficients_3d(u,v,w)
Bu=bspline_coefficients_1d(u);
Bv=bspline_coefficients_1d(v);
Bw=bspline_coefficients_1d(w); 

% Calculate influences of all neighborh b-spline knots
W = [Bu(:,1).*Bv(:,1).*Bw(:,1) ,Bu(:,2).*Bv(:,1).*Bw(:,1) ,Bu(:,3).*Bv(:,1).*Bw(:,1) ,Bu(:,4).*Bv(:,1).*Bw(:,1), ...
     Bu(:,1).*Bv(:,2).*Bw(:,1) ,Bu(:,2).*Bv(:,2).*Bw(:,1) ,Bu(:,3).*Bv(:,2).*Bw(:,1) ,Bu(:,4).*Bv(:,2).*Bw(:,1), ...
     Bu(:,1).*Bv(:,3).*Bw(:,1) ,Bu(:,2).*Bv(:,3).*Bw(:,1) ,Bu(:,3).*Bv(:,3).*Bw(:,1) ,Bu(:,4).*Bv(:,3).*Bw(:,1), ...
     Bu(:,1).*Bv(:,4).*Bw(:,1) ,Bu(:,2).*Bv(:,4).*Bw(:,1) ,Bu(:,3).*Bv(:,4).*Bw(:,1) ,Bu(:,4).*Bv(:,4).*Bw(:,1), ...
     Bu(:,1).*Bv(:,1).*Bw(:,2) ,Bu(:,2).*Bv(:,1).*Bw(:,2) ,Bu(:,3).*Bv(:,1).*Bw(:,2) ,Bu(:,4).*Bv(:,1).*Bw(:,2), ...
     Bu(:,1).*Bv(:,2).*Bw(:,2) ,Bu(:,2).*Bv(:,2).*Bw(:,2) ,Bu(:,3).*Bv(:,2).*Bw(:,2) ,Bu(:,4).*Bv(:,2).*Bw(:,2), ...
     Bu(:,1).*Bv(:,3).*Bw(:,2) ,Bu(:,2).*Bv(:,3).*Bw(:,2) ,Bu(:,3).*Bv(:,3).*Bw(:,2) ,Bu(:,4).*Bv(:,3).*Bw(:,2), ...
     Bu(:,1).*Bv(:,4).*Bw(:,2) ,Bu(:,2).*Bv(:,4).*Bw(:,2) ,Bu(:,3).*Bv(:,4).*Bw(:,2) ,Bu(:,4).*Bv(:,4).*Bw(:,2), ...
     Bu(:,1).*Bv(:,1).*Bw(:,3) ,Bu(:,2).*Bv(:,1).*Bw(:,3) ,Bu(:,3).*Bv(:,1).*Bw(:,3) ,Bu(:,4).*Bv(:,1).*Bw(:,3), ...
     Bu(:,1).*Bv(:,2).*Bw(:,3) ,Bu(:,2).*Bv(:,2).*Bw(:,3) ,Bu(:,3).*Bv(:,2).*Bw(:,3) ,Bu(:,4).*Bv(:,2).*Bw(:,3), ...
     Bu(:,1).*Bv(:,3).*Bw(:,3) ,Bu(:,2).*Bv(:,3).*Bw(:,3) ,Bu(:,3).*Bv(:,3).*Bw(:,3) ,Bu(:,4).*Bv(:,3).*Bw(:,3), ...
     Bu(:,1).*Bv(:,4).*Bw(:,3) ,Bu(:,2).*Bv(:,4).*Bw(:,3) ,Bu(:,3).*Bv(:,4).*Bw(:,3) ,Bu(:,4).*Bv(:,4).*Bw(:,3), ...
     Bu(:,1).*Bv(:,1).*Bw(:,4) ,Bu(:,2).*Bv(:,1).*Bw(:,4) ,Bu(:,3).*Bv(:,1).*Bw(:,4) ,Bu(:,4).*Bv(:,1).*Bw(:,4), ...
     Bu(:,1).*Bv(:,2).*Bw(:,4) ,Bu(:,2).*Bv(:,2).*Bw(:,4) ,Bu(:,3).*Bv(:,2).*Bw(:,4) ,Bu(:,4).*Bv(:,2).*Bw(:,4), ...
     Bu(:,1).*Bv(:,3).*Bw(:,4) ,Bu(:,2).*Bv(:,3).*Bw(:,4) ,Bu(:,3).*Bv(:,3).*Bw(:,4) ,Bu(:,4).*Bv(:,3).*Bw(:,4), ...
     Bu(:,1).*Bv(:,4).*Bw(:,4) ,Bu(:,2).*Bv(:,4).*Bw(:,4) ,Bu(:,3).*Bv(:,4).*Bw(:,4) ,Bu(:,4).*Bv(:,4).*Bw(:,4)];